/*
  逻辑
  1.获取用户收货地址功能
    1.绑定选择地址事件
    2.调用内置api 获取收货地址 wx.chooseAddress 用户点击取消 之后不能正确的选择地址
    2.获取用户对小程序 授予 获取地址权限的状态 scope
      1.假设用户点击获取提示框 确定按钮 scope= true 直接调用 获取地址api
      2.假设用户从来没有掉用过收货地址 scope=undefined 直接调用 获取地址api
      3.假设用户点击了取消 scope= false
        1.诱导用户打开授权设置页面 wx.openSetting 给与获取地址权限
        2.获取收货地址
      4.把获取到的收货地址 存储到本地存储中
  2.页面加载完毕 onLoad onShow
    1.获取本地存储中的地址数据
    2.把数据设置成data中的一个变量
  3.onShow
    0.回到商品详情页面 手动添加一个属性 checked
      1.num=1;
      2.checked=true;
    1.获取缓存中的购物车数据
    2.把数据添加到data中
  4.全选的实现  数据的展示
    1.onShow 获取购物车的数据数组
    2.根据购物车的商品数据进行计算
      1.所有的商品被选中checked=true 全选按钮就选中
  5.计算总价格和 总数量
    1.都需要商品被选中 我们才拿他来计算
    2.获取购物车数组
    3.遍历数组
    4.判断是否被选中
    5.总价格= 单价* 商品数量
    5.总数量 += 商品数量
    6.把数据设置到data中
  6.商品的选中功能
    1.绑定change事件
    2.获取被修改的商品对象
    3.商品对象 的状态 取反
    4.重新填入到data和缓存中
    5.重新计算总数量 总价格。。。
  7.商品的全选和反选功能
    1.给复选框绑定事件
    2.获取data中的allChecked变量
    3.直接取反
    4.遍历购物车数组 让里面的商品选中状态跟随allChecked改变
    5.把购物车数组 和 选中状态重新设置到data中 和缓存中
  8.商品数量的编辑功能
    1.给按钮+ -绑定同一个点击事件 区分：自定义属性
      1.+ 自定义属性的值"+1"
      2.- 自定义属性的值"-1"
    2.传递被点击的goods_id
    3.获取data中的购物车数组 根据id获取需要被修改的商品对象
    4.修改num
      1.当当前数量为1  同时用户点击- 弹出对话框 是否删除该商品 wx.showModal
      2.确定  删除  取消 不变
    5.把cart数组重新设置回缓存中和data中 this.setCart(cart)
  9.商品结算功能
    1.判断有无收货地址信息
    2.判断有无选购商品
    3.跳转到支付页面



 */

import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from "../../utils/asyncWx.js";
import regeneratorRuntime from "../../lib/runtime/runtime.js";

Page({
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },
  onShow() {
    //1.获取缓存中的收货地址信息
    const address = wx.getStorageSync("address");
    // 获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart") || [];

    this.setData({
      address
    });
    this.setCart(cart);
  },
  //点击按钮添加地址事件
  async handleChooseAddress() {
    //1.获取权限状态
    // wx.getSetting({
    //   success: (result)=>{
    //     //2.判断权限状态 只要发现一些属性名很怪异 都要使用[]来获取属性值
    //     const scopeAddress = result.authSetting["scope.address"];
    //     //用户点击了确定授予权限
    //     if (scopeAddress === true||scopeAddress===undefined) {
    //       wx.chooseAddress({
    //         success: (result1)=>{
    //           console.log(result1);
    //         }
    //       });
    //     } else {
    //       //3.用户点击过拒绝授予权限 先诱导用户打开权限设置 授予权限
    //       wx.openSetting({
    //         success: (result2)=>{
    //           //4.调用 获取收货地址代码
    //           wx.chooseAddress({
    //             success: (result3)=>{
    //               console.log(result3);
    //             }
    //           });
    //         }
    //       });
    //     }
    //   }
    // });

    try {
      //通过async优化 获取收货地址的代码
      //1.获取权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      //2.判断权限状态
      if (scopeAddress === false) {
        await openSetting();
      } else {
        //3.调用 获取收货地址代码
        let address = await chooseAddress();
        address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;
        //4.把地址存入到缓存中
        wx.setStorageSync("address", address);
      }
    } catch (error) {
      console.log(error);
    }
  },
  // 点击商品选中事件
  handleItemChange(e) {
    //1.获取被修改的商品id
    const goods_id = e.currentTarget.dataset.id;
    //2.获取购物车数组
    let {
      cart
    } = this.data;
    //3.找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === goods_id);
    //4.选中状态取反
    cart[index].checked = !cart[index].checked;

    this.setCart(cart);

  },
  //封装 设置购物车状态 同时重新计算底部工具栏的总价格 总数量 全选
  setCart(cart) {

    //7.重新计算总价格和总数量
    let allChecked = true;
    // 总数量  总价格 
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      if (v.checked) {
        totalPrice = v.num * v.goods_price;
        totalNum += v.num;
      } else {
        allChecked = false;
      }
    });
    // 判断数组是否为空
    allChecked = cart.length != 0 ? allChecked : false;
    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    });
    //5.6.把购物车数据重新设置回data中和缓存中

    wx.setStorageSync("cart", cart);
  },
  // 商品全选功能
  handleItemAllCheck() {
    //1.获取data中的数据
    let {
      cart,
      allChecked
    } = this.data;
    //2.修改值
    allChecked = !allChecked;
    //3.遍历数组修改cart数组的商品选中状态
    cart.forEach(v => v.checked = allChecked);
    //4.把修改后的值设置到data或者缓存中
    this.setCart(cart);
  },
  // 商品数量编辑
  async handleItemNumEdit(e) {
    //1.获取传递过来的参数
    const {
      operation,
      id
    } = e.currentTarget.dataset;
    //2.获取购物车数组
    let {
      cart
    } = this.data;
    //3.找到需要修改的数据的索引
    const index = cart.findIndex(v => v.goods_id === id);
    //3.1 判断是否执行删除
    if (cart[index].num === 1 && operation === -1) {
      //3.2弹窗提示
      const result = await showModal({
        content: '您是否要删除该商品?'
      });
      if (result.confirm) {
        cart.splice(index, 1);
        this.setCart(cart);
      }
    } else {
      //4.修改数量num
      cart[index].num += operation;
      //5.设置回缓存和data中
      this.setCart(cart);
    }
  },
  // 商品结算功能
  async handlePay() {
    //1.判断收获地址
    const {address,totalNum} = this.data;
    if (!address.userName) {
      await showToast({title:"您还没有选择收货地址"});
      return;
    }
    //2.判断有无选购商品
    if (totalNum===0) {
      await showToast({title:"您还没有选购任何商品"});
      return;
    }
    //3.跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/pay'
    });
  }
})